Skip to content

fix[notask]: ship Parakeet CPU-only on Android to stop Adreno Vulkan SIGABRT#2525

Open
Zbig9000 wants to merge 2 commits into
tetherto:mainfrom
Zbig9000:fix-parakeet-android-gpu-disable
Open

fix[notask]: ship Parakeet CPU-only on Android to stop Adreno Vulkan SIGABRT#2525
Zbig9000 wants to merge 2 commits into
tetherto:mainfrom
Zbig9000:fix-parakeet-android-gpu-disable

Conversation

@Zbig9000

Copy link
Copy Markdown
Contributor

🎯 What problem does this PR solve?

📝 How does it solve it?

Root cause: ParakeetModel::load already forces useGPU=false on Android (n_gpu_layers=0) "pending Vulkan/Mali and OpenCL/Adreno driver fixes" — but the addon still ships the libqvac-speech-ggml-{vulkan,opencl}.so backends, and parakeet-cpp's ggml_backend_load_all_from_path() initialises the Adreno Vulkan device regardless of n_gpu_layers. Once parakeet-cpp 2026-06-04#0 (#2461) added robust Adreno-generation detection, that init engages the Adreno Vulkan backend on the S25 Ultra and aborts in ggml.

Evidence it's a dependency regression (not the addon code): the same transcription-parakeet@0.7.1 passed Parakeet 4/4 on Android on Jun 5 (run 27030121365) — that build used the older parakeet-cpp 2026-05-26#2, which didn't detect the Adreno and stayed on CPU.

Fix: drop the vulkan/opencl vcpkg features from the Android parakeet-cpp dependency, so the Android prebuild is CPU-only — no GPU backend .so is shipped, so nothing initialises the Adreno driver. This completes the existing engine-boundary GPU-disable policy. iOS (Metal) and desktop (Vulkan) are unchanged. Version 0.7.10.7.2 (SDK pins ^0.7.1, so it picks this up).

This is the same class of Android Adreno-GPU ggml instability as the tts-ggml / Supertonic defect.

🧪 How was it tested?

  • Root-caused from two independent device-farm crashes (same ggml-vulkan init → SIGABRT signature) + a known-good comparison (Jun 5 green run on old parakeet-cpp = CPU).
  • ⚠️ I could not build the Android prebuild locally — needs the verified label to run the prebuild + Device Farm parakeet suite to confirm CPU-only loads cleanly. The readelf-style ground truth here is the Device Farm run getting past parakeet-tdt-wav.

💥 Breaking Changes

  • Parakeet on Android is now CPU-only at the build level (GPU was already disabled at runtime via the engine-boundary useGPU=false, so no behavior change for callers). Re-enable once the upstream Adreno Vulkan/OpenCL ggml path is fixed.

➡️ Follow-up

  • Track the upstream parakeet-cpp / ggml Adreno Vulkan/OpenCL instability (same root family as the Supertonic-Adreno abort) so GPU can be re-enabled on Android.
  • A ticket should be linked (used [notask] as a placeholder).

Drafted by a Cursor agent.

…SIGABRT

@qvac/transcription-parakeet crashes on Android (SIGABRT on the Bare mqt_v_js
worklet) ~8s into loading the parakeet-tdt-0.6b-v3 model, killing the consumer
and failing the whole Android e2e batch ("All consumers are dead"). Confirmed
on device-farm runs 27282459468 and 27286841825 (Samsung S25 Ultra): the crash
is immediately preceded by `AdrenoVK-0: Application Name: ggml-vulkan` and the
backtrace is entirely inside libqvac__transcription-parakeet.0.7.1.so.

Root cause: ParakeetModel::load already forces useGPU=false on Android
(n_gpu_layers=0) "pending Vulkan/Mali and OpenCL/Adreno driver fixes", but the
addon still ships the libqvac-speech-ggml-{vulkan,opencl}.so backends, and
parakeet-cpp's ggml_backend_load_all_from_path() initialises the Adreno Vulkan
device regardless of n_gpu_layers. After parakeet-cpp 2026-06-04#0 (tetherto#2461) added
robust Adreno-generation detection, that init engages the Adreno Vulkan backend
on the S25 Ultra and aborts in ggml graph compute. The same parakeet@0.7.1
passed on Android on Jun 5 (run 27030121365) with the older parakeet-cpp
2026-05-26#2, which did not detect the Adreno and stayed on CPU.

Fix: drop the vulkan/opencl vcpkg features from the Android parakeet-cpp
dependency so the Android prebuild is CPU-only (no GPU backend .so is shipped ->
nothing initialises the Adreno driver), completing the existing engine-boundary
GPU-disable policy. iOS (Metal) and desktop (Vulkan) builds are unchanged.
Bump 0.7.1 -> 0.7.2.

Same class of Android Adreno-GPU ggml instability as the tts-ggml / Supertonic
issue; re-enable once the upstream parakeet-cpp / ggml Adreno Vulkan/OpenCL path
is fixed.

Co-authored-by: Cursor <cursoragent@cursor.com>
@Zbig9000 Zbig9000 requested review from a team as code owners June 10, 2026 16:36
@Zbig9000 Zbig9000 requested a review from ishanvohra2 June 10, 2026 16:48
@ishanvohra2 ishanvohra2 added the verified Authorize secrets / label-gate in PR workflows label Jun 10, 2026
@Zbig9000

Copy link
Copy Markdown
Contributor Author

#2525 can be closed because #2529 was merged and it resolved the issue completely.

@Zbig9000 Zbig9000 closed this Jun 11, 2026
@Zbig9000 Zbig9000 reopened this Jun 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

verified Authorize secrets / label-gate in PR workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants